昨天已經在storyboard上將tableView連結上程式中的table,不過並沒有解釋到比較仔細原理的部分。今天回歸到controller程式面,因此會稍加解釋想要加上tableView的流程,與畫面/程式兩邊的邏輯。
@IBOutlet var table: UITableView!
這是在一開始我們就先寫在ViewController裡的。
其中的驚嘆號,回顧一下第2天的swift 101有討論到強制取值,這邊表示table在之後邏輯中,不需要再額外加上!
就會自動取值。
而前綴@IBOutlet
與待會使用到的@IBAction
則是有以下的功能 :arrow_down:IBOutlet:建立一個變數(Var),來存取或修改畫面上的元件(Object)。 IBAction:建立事件發生時所要執行的Function。不是每一個元件(Object)都可以拉Action,只有繼承UIControl的元件(Object)才可以建立Action,例如Label就無法建立,因為Label只是用來顯示,並不會有任何觸發動作
因此,我們昨天才可以將tableView跟viewController中的table bind起來。
@IBAction func didTapAddButton()
那此時我們新增一個方法,希望點下右上方加號的時候可以進行新增的動作。
回到storyboard,如上,一樣的邏輯,我們可以右鍵點選畫面上方左邊的變數設定選項,進而將button與action連結。
除了新增,還有瀏覽、以及刪除的功能,因此我們再來新增兩個view controller。找到後直接拖拉到畫面中,或是click兩下/按下enter也可以。
相對應的,我們也要新增兩個view controller
可使用以下路徑去新增
File > New > > File > Cocoa Touch Class > Subclass of UIViewController
分別取名為如下
import RealmSwift
import UIKit
class EntryViewController: UIViewController, UITextFieldDelegate {
除了繼承UIViewController
,我們也加上UITextFieldDelegate
,以使得text的委派對象成為自己。如此一來,當按下return鍵的時候,就可以離開鍵盤。
var textField: UITextField!
@IBOutlet var datePicker: UIDatePicker!
private let realm = try! Realm()
public var completionHandler: (() -> Void)?
接下來根據realm提供的官方方法進行default連線,拿到資料庫的referencecompletionHandler
要做的事是新增後讓list知道新增了一個item,然後重新拿資料。
override func viewDidLoad() {
super.viewDidLoad()
textField.becomeFirstResponder()
textField.delegate = self
}
因為我們希望一新增的時候可以直接將游標指定到第一欄,因此在載入的時候就把textField設定為first responder。
也就是說,如果有多個textField,可以設定離開時將下一個textField指定為first responder。
接著,必須再實作一個方法textFieldShouldReturn
,並resign first responder,當結束輸入的時候把keyboard拿掉。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
@IBAction func didTapSaveButton() {
}
}
當然,也先把按下儲存按鈕的方法框寫起來。
寫了約莫一週,原先以為一個簡單的to-do list兩天就可以做完XD
結果到了開發第5天連個基本的CRUD都還沒做出來,哈哈~
覺得mobile很多的工具我都不熟悉,因此現在只能看一個學一個,不知道如果當初選obj-c會發生什麼事情XDDD
明天會再回到storyboard,如果有任何文章上的建議,不管是我個人學習或開發上的,都歡迎留言給我。謝謝~(•͈⌔•͈⑅)